//package com.ssfeng.youxia.dao;
//
//import com.ssfeng.youxia.model.Model;
//import org.apache.commons.collections.CollectionUtils;
//import org.hibernate.*;
//import org.hibernate.transform.Transformers;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.orm.hibernate4.HibernateCallback;
//import org.springframework.orm.hibernate4.HibernateTemplate;
//import org.springframework.stereotype.Repository;
//import org.springframework.transaction.annotation.Propagation;
//import org.springframework.transaction.annotation.Transactional;
//
//import java.io.Serializable;
//import java.util.Collection;
//import java.util.List;
//
//@Repository("baseDao")
//public class BaseDao {
//
//	private SessionFactory sessionFactory;
//
//	private HibernateTemplate hibernateTemplate;
//
//	public <T extends Model> T findById(Class<T> entityClass, Serializable id) {
//		// T model = hibernateTemplate.get(entityClass, id);
//		T model = (T) currentSession().get(entityClass, id);
//		return model;
//	}
//
//	public <T> List<T> queryForListWithVo(final String sql, final Object[] params, final Class T,
//			final List<String> scalarList) {
//		return (List<T>) hibernateTemplate.execute(new HibernateCallback() {
//			@Override
//			public T doInHibernate(Session session) throws HibernateException {
//
//				SQLQuery query = session.createSQLQuery(sql);
//				if (scalarList != null && scalarList.size() > 0) {
//					for (String str : scalarList) {
//						query.addScalar(str);
//					}
//				}
//				bindParameter(query, params);
//				if (T != null) {
//					query.setResultTransformer(Transformers.aliasToBean(T));
//				}
//				List list = query.list();
//				return (T) list;
//
//			}
//
//		});
//
//	}
//
//	protected void bindParameter(Query query, Object[] params) {
//		if ((params == null) || (params.length == 0)) {
//			return;
//		}
//		for (int i = 0; i < params.length; i++) {
//			if (params[i] instanceof Collection<?>) {
//				query.setParameterList("paramIn" + i, (Collection<?>) params[i]);
//			} else if (params[i] instanceof Object[]) {
//				query.setParameterList("paramIn" + i, (Object[]) params[i]);
//			} else {
//				query.setParameter(i, params[i]);
//			}
//		}
//	}
//
//	/***
//	 *
//	 * @Title: save @Description: 新增对象 @param: model @param: @return: T @throws
//	 */
//	@Transactional(readOnly = false, propagation = Propagation.REQUIRED)
//	public <T extends Model> T save(T model) {
//		Serializable id = currentSession().save(model);
//		//Serializable id = hibernateTemplate.save(model);
//		model.setKeyId(id);
//		return model;
//	}
//
//	@Transactional(readOnly = false, propagation = Propagation.REQUIRED)
//	public <T extends Model> List<T> queryForList(final String hql, final Object[] params) {
//		Query query = currentSession().createQuery(hql);
//		bindParameter(query, params);
//		return query.list();
//		// return (List<T>) getHibernateTemplate().execute(new HibernateCallback() {
//		// public Object doInHibernate(Session session) throws HibernateException {
//		// Query query = session.createQuery(hql);
//		// bindParameter(query, params);
//		// return query.list();
//		// }
//		// });
//	}
//
//	/***
//	 *
//	 * @Title: queryForListOne @Description: 查询一个对象 @param: hql @param:
//	 *         params @param: @return: T @throws
//	 */
//	public <T extends Model> T queryForListOne(final String hql, final Object[] params) {
//		List<T> list = queryForList(hql, params);
//		if (CollectionUtils.isNotEmpty(list)) {
//			return list.get(0);
//		}
//		return null;
//	}
//
//	public <T extends Model> void deleteById(Class<T> entityClass, Serializable id) {
//		Object entity = findById(entityClass, id);
//		// getHibernateTemplate().delete(entity);
//		currentSession().delete(entity);
//	}
//
//	public <T extends Model> void update(T entity) {
//		// hibernateTemplate.update(entity);
//		currentSession().update(entity);
//	}
//
//	public SessionFactory getSessionFactory() {
//		return sessionFactory;
//	}
//
//	@Autowired
//	public void setSessionFactory(SessionFactory sessionFactory) {
//		this.sessionFactory = sessionFactory;
//	}
//
//	// public HibernateTemplate getHibernateTemplate() {
//	// return hibernateTemplate;
//	// }
//	//
//	@Autowired
//	public void setHibernateTemplate(HibernateTemplate hibernateTemplate) {
//		this.hibernateTemplate = hibernateTemplate;
//	}
//	private Session currentSession() {
//		Session session=sessionFactory.getCurrentSession();
//		return session;
//	}
//
//}
